package page

import (
	"BookStack/internal/domain/page"
	"BookStack/pkg/utils"
)

// CreatePageRequest 创建自定义页面请求
type CreatePageRequest struct {
	Title       string `json:"title" binding:"required,max=100"`
	Slug        string `json:"slug" binding:"required,max=100"`
	Content     string `json:"content" binding:"required"`
	Description string `json:"description" binding:"max=200"`
	Status      int    `json:"status" binding:"oneof=0 1"`
}

// UpdatePageRequest 更新自定义页面请求
type UpdatePageRequest struct {
	Title       string `json:"title" binding:"required,max=100"`
	Slug        string `json:"slug" binding:"required,max=100"`
	Content     string `json:"content" binding:"required"`
	Description string `json:"description" binding:"max=200"`
	Status      int    `json:"status" binding:"oneof=0 1"`
}

// SetPageStatusRequest 设置自定义页面状态请求
type SetPageStatusRequest struct {
	Status int `json:"status" binding:"required,oneof=0 1"`
}

// PageResponse 自定义页面响应
type PageResponse struct {
	ID          uint           `json:"id"`
	Title       string         `json:"title"`
	Slug        string         `json:"slug"`
	Content     string         `json:"content,omitempty"`
	Description string         `json:"description"`
	Status      int            `json:"status"`
	ViewCount   int64          `json:"view_count"`
	CreatedBy   uint           `json:"created_by"`
	CreatedAt   utils.JSONTime `json:"created_at"`
	UpdatedAt   utils.JSONTime `json:"updated_at"`
}

// PageListQueryParams 自定义页面列表查询参数
type PageListQueryParams struct {
	Page     int  `json:"page" form:"page"`
	PageSize int  `json:"page_size" form:"page_size" binding:"max=10"`
	Status   *int `json:"status" form:"status"`
}

// PageListResponse 自定义页面列表响应
type PageListResponse struct {
	Items    []*PageBriefResponse `json:"items"`
	Total    int64                `json:"total"`
	Page     int                  `json:"page"`
	PageSize int                  `json:"page_size"`
}

// PageBriefResponse 自定义页面简要信息响应（不包含内容）
type PageBriefResponse struct {
	ID          uint           `json:"id"`
	Title       string         `json:"title"`
	Slug        string         `json:"slug"`
	Description string         `json:"description"`
	Status      int            `json:"status"`
	ViewCount   int64          `json:"view_count"`
	CreatedAt   utils.JSONTime `json:"created_at"`
	UpdatedAt   utils.JSONTime `json:"updated_at"`
}

// PageToResponse 将页面实体转换为响应DTO
func PageToResponse(p *page.Page) *PageResponse {
	if p == nil {
		return nil
	}

	return &PageResponse{
		ID:          p.ID,
		Title:       p.Title,
		Slug:        p.Slug,
		Content:     p.Content,
		Description: p.Description,
		Status:      p.Status,
		ViewCount:   p.ViewCount,
		CreatedBy:   p.CreatedBy,
		CreatedAt:   utils.JSONTime(p.CreatedAt),
		UpdatedAt:   utils.JSONTime(p.UpdatedAt),
	}
}

// PageToBriefResponse 将页面实体转换为简要响应DTO（不包含内容）
func PageToBriefResponse(p *page.Page) *PageBriefResponse {
	if p == nil {
		return nil
	}

	return &PageBriefResponse{
		ID:          p.ID,
		Title:       p.Title,
		Slug:        p.Slug,
		Description: p.Description,
		Status:      p.Status,
		ViewCount:   p.ViewCount,
		CreatedAt:   utils.JSONTime(p.CreatedAt),
		UpdatedAt:   utils.JSONTime(p.UpdatedAt),
	}
}

// PagesToListResponse 将页面实体列表转换为列表响应
func PagesToListResponse(pages []*page.Page, total int64, pageNum, pageSize int) *PageListResponse {
	items := make([]*PageBriefResponse, 0, len(pages))
	for _, p := range pages {
		items = append(items, PageToBriefResponse(p))
	}

	return &PageListResponse{
		Items:    items,
		Total:    total,
		Page:     pageNum,
		PageSize: pageSize,
	}
}
